//using System;
//using System.Collections.Generic;
//using System.Data;
//using System.Data.Entity.Infrastructure;
//using System.Linq;
//using System.Linq.Expressions;
//using System.Data.Entity;
////using System.Transactions;
////using br.com.autotrac.logcenter.Common.Util;
////using br.com.autotrac.logcenter.DAO.EntityFramework;

//namespace br.com.autotrac.logcenter.DAO.Repository
//{
//    public class Repository<T> : IRepository<T> where T : class
//    {
//        //public static IRepository<T> RepositoryFake { get; set; }

//        //private readonly DbContext ctx;

//        //protected Repository(DbContext context)
//        //{
//        //    ctx = context;
//        //}

//        //public static IRepository<T> Instance(DbContext context)
//        //{
//        //    return RepositoryFake ?? new Repository<T>(context);
//        //}

//        //public void Insert(T entity)
//        //{
//        //    ApplyState(entity, EntityState.Added);
//        //    ctx.Set<T>().Add(entity);
//        //}

//        //public void Update(T entity)
//        //{
//        //    ApplyState(entity, EntityState.Modified);
//        //}

//        //public void Delete(T entity)
//        //{
//        //    ApplyState(entity, EntityState.Deleted);
//        //    ctx.Set<T>().Remove(entity);
//        //}

//        //public T FirstOrDefault(Expression<Func<T, bool>> expression, params string[] navigations)
//        //{
//        //    using (TransactionScopeManager.ReadUncommitted)
//        //    {
//        //        var set = ctx.Set<T>();
//        //        LoadNavigation(set, navigations);
//        //        return ctx.Set<T>().FirstOrDefault(expression);
//        //    }
//        //}

//        //public IQueryable<T> Query(params string[] navigations)
//        //{
//        //    using (TransactionScopeManager.ReadUncommitted)
//        //    {
//        //        var set = ctx.Set<T>();
//        //        LoadNavigation(set, navigations);
//        //        return set;
//        //    }
//        //}

//        //public IQueryable<T> PagedQuery(IQueryable<T> entities, DataPager<T> pager)
//        //{
//        //    using (TransactionScopeManager.ReadUncommitted)
//        //    {
//        //        pager.TotalRows = entities.Count();

//        //        var orderedList = pager.IsDescending
//        //            ? entities.OrderByDescending(pager.OrderBy)
//        //            : entities.OrderBy(pager.OrderBy);

//        //        var list = orderedList.Skip(pager.RowsPerPage * (pager.PageIndex - 1))
//        //        .Take(pager.RowsPerPage);

//        //        return list;
//        //    }
//        //}

//        //public bool Any(Expression<Func<T, bool>> expression, params string[] navigations)
//        //{
//        //    using (TransactionScopeManager.ReadUncommitted)
//        //    {
//        //        var set = ctx.Set<T>();
//        //        LoadNavigation(set, navigations);
//        //        return set.Any(expression);
//        //    }
//        //}

//        //private void ApplyState(T entity, EntityState state)
//        //{
//        //    if (ctx.Entry(entity).State == EntityState.Detached)
//        //    {
//        //        ctx.Set<T>().Attach(entity);
//        //        ctx.Entry(entity).State = state;
//        //    }
//        //}

//        //private void LoadNavigation(DbSet<T> set, IEnumerable<string> navigations)
//        //{
//        //    foreach (var nav in navigations)
//        //        set.Include(nav);
//        //}
//    }
//}
